home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 551-575 / disk_570 / gadtoolsbox / source / source.lha / MenuEd.c < prev    next >
C/C++ Source or Header  |  1991-11-04  |  17KB  |  468 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   MenuEd.c
  4. *   Copyright       :   © Copyright 1991 Jaba Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   28-Oct-91
  7. *   Current version :   1.00
  8. *   Translator      :   DICE v2.6
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   28-Oct-91     1.00            Menu edit requester.
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "GTEd.h"
  19. #include "Protos.h"
  20.  
  21. /*
  22.  * --- External referenced data.
  23.  */
  24. extern ULONG                 Class;
  25. extern UWORD                 Code;
  26. extern struct TextAttr       Topaz80, MainFont;
  27. extern APTR                  MainVisualInfo;
  28. extern struct Screen        *MainScreen;
  29. extern struct Window        *MainWindow;
  30. extern struct Gadget        *Object;
  31. extern struct MemoryChain   *Chain;
  32. extern struct Menu          *MainMenus;
  33. extern UBYTE                 MainScreenTitle[80], MainWindowTitle[80];
  34. extern BOOL                  Saved;
  35.  
  36. /*
  37.  * --- Gadget ID
  38.  */
  39. #define GD_LIST          0
  40. #define GD_ENTER         1
  41. #define GD_DISABLED      2
  42. #define GD_ITEMED        3
  43. #define GD_DELETE        4
  44. #define GD_DONE          5
  45.  
  46. /*
  47.  * --- Module data.
  48.  */
  49. struct Window           *meWnd   = NULL;
  50. struct Gadget           *meGList = NULL;
  51. struct Gadget           *meGadgets[3];
  52. struct ExtNewMenu       *meMenu = 0l;
  53.  
  54. struct ExtMenuList       ExtMenus;
  55. BOOL                     meDisabled = FALSE;
  56.  
  57. WORD                     meZoom[4];
  58.  
  59. struct TagItem           menwTags[] = {
  60.     WA_Left,                0l,
  61.     WA_Top,                 0l,
  62.     WA_Width,               0l,
  63.     WA_Height,              0l,
  64.     WA_IDCMP,               IDCMP_CLOSEWINDOW | BUTTONIDCMP | LISTVIEWIDCMP  | CHECKBOXIDCMP | IDCMP_VANILLAKEY | IDCMP_REFRESHWINDOW,
  65.     WA_Flags,               WFLG_DRAGBAR | WFLG_DEPTHGADGET| WFLG_CLOSEGADGET | WFLG_ACTIVATE | WFLG_RMBTRAP | WFLG_SMART_REFRESH,
  66.     WA_Gadgets,             0l,
  67.     WA_Title,               "Edit Menus:",
  68.     WA_AutoAdjust,          TRUE,
  69.     WA_Zoom,                (Tag)meZoom,
  70.     WA_CustomScreen,        0l,
  71.     TAG_DONE };
  72.  
  73. /*
  74.  * --- Make a dummy item.
  75.  */
  76. struct ExtNewMenu *MakeDummy( void )
  77. {
  78.     struct ExtNewMenu *dummy;
  79.  
  80.     if ( dummy = ( struct ExtNewMenu * ) AllocItem( Chain, (long)sizeof( struct ExtNewMenu ), MEMF_PUBLIC )) {
  81.         strcpy( &dummy->em_TheMenuName[0], "DUMMY" );
  82.         dummy->em_NewMenu.nm_Label = &dummy->em_TheMenuName[0];
  83.         dummy->em_NodeName         = &dummy->em_TheMenuName[0];
  84.         dummy->em_NewMenu.nm_Type  = NM_ITEM;
  85.         dummy->em_NewMenu.nm_Flags = NM_ITEMDISABLED;
  86.         dummy->em_Dummy            = TRUE;
  87.         return( dummy );
  88.     }
  89.     return( NULL );
  90. }
  91.  
  92. /*
  93.  * --- Set up a ExtNewMenu
  94.  */
  95. struct ExtNewMenu *GetExtMenu( UBYTE *name, long type )
  96. {
  97.     struct ExtNewMenu   *menu, *dummy;
  98.  
  99.     if ( menu = ( struct ExtNewMenu * )AllocItem( Chain, (long)sizeof( struct ExtNewMenu ), MEMF_PUBLIC )) {
  100.         strcpy( &menu->em_TheMenuName[0], name );
  101.         menu->em_NewMenu.nm_Type  = type;
  102.         menu->em_NewMenu.nm_Label = &menu->em_TheMenuName[0];
  103.         menu->em_NodeName         = &menu->em_TheMenuName[0];
  104.         if ( type == NM_TITLE ) {
  105.             if ( menu->em_Items = ( struct ExtMenuList * )AllocItem( Chain, (long)sizeof( struct ExtMenuList ), MEMF_PUBLIC )) {
  106.                 NewList(( struct List * )menu->em_Items );
  107.                 if ( dummy = MakeDummy()) {
  108.                     menu->em_SpecialFlags |= EMF_HASDUMMY;
  109.                     AddTail(( struct List * )menu->em_Items, ( struct Node * )dummy );
  110.                 } else goto noMem;
  111.             } else goto noMem;
  112.         }
  113.         return( menu );
  114.     }
  115.     noMem:
  116.     MyRequest( "Ouch...", "OK", "Out of memory !" );
  117.     return( 0l );
  118. }
  119.  
  120. /*
  121.  * --- Free the list
  122.  */
  123. void FreeMenuList( struct ExtMenuList *list, long all )
  124. {
  125.     struct ExtNewMenu *tmp;
  126.  
  127.     while ( tmp = ( struct ExtNewMenu * )RemHead(( struct List * )list ))
  128.         FreeItem( Chain, tmp, (long)sizeof( struct ExtNewMenu ));
  129.  
  130.     if ( all )
  131.         FreeItem( Chain, list, (long)sizeof( struct ExtMenuList ));
  132. }
  133.  
  134. /*
  135.  * --- Free the items from a menu and the menu.
  136.  */
  137. void FreeMenu( struct ExtNewMenu *menu )
  138. {
  139.     struct ExtNewMenu *item;
  140.  
  141.     if( menu->em_Items ) {
  142.         for ( item = menu->em_Items->ml_First; item->em_Next; item = item->em_Next ) {
  143.             if ( item->em_Items )
  144.                 FreeMenuList( item->em_Items, TRUE );
  145.         }
  146.         FreeMenuList( menu->em_Items, TRUE );
  147.     }
  148.     FreeItem( Chain, menu, (long)sizeof( struct ExtNewMenu ));
  149. }
  150.  
  151. /*
  152.  * --- Free all NewMenus.
  153.  */
  154. void FreeNewMenus( void )
  155. {
  156.     struct ExtNewMenu   *menu;
  157.  
  158.     while ( menu = ( struct ExtNewMenu * )RemHead(( struct List * )&ExtMenus ))
  159.         FreeMenu( menu );
  160. }
  161.  
  162. /*
  163.  * --- Test the menus.
  164.  */
  165. void TestMenus( void )
  166. {
  167.     struct ExtNewMenu   *menu, *item, *sub;
  168.     struct NewMenu      *strip, *tmp;
  169.     struct Menu         *themenu;
  170.     UWORD                num = 0;
  171.  
  172.     for ( menu = ExtMenus.ml_First; menu->em_Next; menu = menu->em_Next ) {
  173.         num++;
  174.         for ( item = menu->em_Items->ml_First; item->em_Next;  item = item->em_Next ) {
  175.             num++;
  176.             for ( sub = item->em_Items->ml_First; sub->em_Next;  sub = sub->em_Next )
  177.                 num++;
  178.         }
  179.     }
  180.  
  181.     num++;
  182.  
  183.     if ( tmp = strip = ( struct NewMenu * )AllocItem( Chain, (long)sizeof( struct NewMenu ) * num, MEMF_PUBLIC )) {
  184.         for ( menu = ExtMenus.ml_First; menu->em_Next; menu = menu->em_Next ) {
  185.             CopyMem(( char * )&menu->em_NewMenu, tmp++, (long)sizeof( struct NewMenu ));
  186.             for ( item = menu->em_Items->ml_First; item->em_Next;  item = item->em_Next ) {
  187.                 CopyMem(( char * )&item->em_NewMenu, tmp++, (long)sizeof( struct NewMenu ));
  188.                 for ( sub = item->em_Items->ml_First; sub->em_Next;  sub = sub->em_Next )
  189.                     CopyMem(( char * )&sub->em_NewMenu, tmp++, (long)sizeof( struct NewMenu ));
  190.             }
  191.         }
  192.         tmp->nm_Type = NM_END;
  193.         if ( themenu = CreateMenus( strip, GTMN_FrontPen, 0, TAG_DONE  )) {
  194.             LayoutMenus( themenu, MainVisualInfo, GTMN_TextAttr, &MainFont, TAG_DONE );
  195.  
  196.             ClearMenuStrip( MainWindow );
  197.             SetMenuStrip( MainWindow, themenu );
  198.  
  199.             SetTitle( "TESTING MENUS !! ESC TO QUIT..." );
  200.  
  201.             while ( Code != 0x45 ) {
  202.                 WaitPort( MainWindow->UserPort );
  203.                 while( ReadIMsg( MainWindow )) {
  204.                     if ( Class == IDCMP_MENUPICK )
  205.                         SetTitle( "TESTING MENUS !! ESC TO QUIT..." );
  206.                 }
  207.             }
  208.  
  209.             ClearMenuStrip( MainWindow );
  210.             ResetMenuStrip( MainWindow, MainMenus );
  211.             FreeMenus( themenu );
  212.             SetWindowTitles( MainWindow, MainWindowTitle, MainScreenTitle );
  213.         }
  214.         FreeItem( Chain, strip, (long)sizeof( struct NewMenu ) * num );
  215.     }
  216. }
  217.  
  218. /*
  219.  * --- Display the Menu Edit requester.
  220.  */
  221. long MenuEdit( void )
  222. {
  223.     struct Gadget       *g;
  224.     struct NewGadget     ng;
  225.     BOOL                 running =  TRUE;
  226.     WORD                 l, t, w, h, btop, bleft;
  227.     struct ExtNewMenu   *menu;
  228.     UBYTE               *ptr;
  229.  
  230.     btop  = MainScreen->WBorTop + MainScreen->RastPort.TxHeight;
  231.     bleft = MainScreen->WBorLeft;
  232.  
  233.     w = bleft + MainScreen->WBorRight  + 300;
  234.     h = btop  + MainScreen->WBorBottom + 117;
  235.     l = (( MainScreen->Width  >> 1 ) - ( w >> 1 ));
  236.     t = (( MainScreen->Height >> 1 ) - ( h >> 1 ));
  237.  
  238.     meZoom[0] = 0;
  239.     meZoom[1] = btop;
  240.     meZoom[2] = 200;
  241.     meZoom[3] = btop;
  242.  
  243.     menwTags[0].ti_Data = l;
  244.     menwTags[1].ti_Data = t;
  245.     menwTags[2].ti_Data = w;
  246.     menwTags[3].ti_Data = h;
  247.  
  248.     menwTags[10].ti_Data = (Tag)MainScreen;
  249.  
  250.     if (( MainScreen->Flags & CUSTOMSCREEN) == CUSTOMSCREEN )
  251.         menwTags[10].ti_Tag  = WA_CustomScreen;
  252.     else if (( MainScreen->Flags & PUBLICSCREEN ) == PUBLICSCREEN )
  253.         menwTags[10].ti_Tag  = WA_PubScreen;
  254.     else
  255.         menwTags[10].ti_Tag  = TAG_DONE;
  256.  
  257.     meDisabled = FALSE;
  258.  
  259.     if ( g = CreateContext( &meGList )) {
  260.  
  261.         ng.ng_Width         =   284;
  262.         ng.ng_Height        =   12;
  263.         ng.ng_GadgetText    =   0l;
  264.         ng.ng_GadgetID      =   GD_ENTER;
  265.         ng.ng_TextAttr      =   &Topaz80;
  266.         ng.ng_VisualInfo    =   MainVisualInfo;
  267.  
  268.         g = CreateGadget( STRING_KIND, g, &ng, GTST_MaxChars, GT_MAXLABELNAME + 1, GT_Underscore, '_', TAG_DONE );
  269.  
  270.         SetStringGadget( g );
  271.  
  272.         meGadgets[ GD_ENTER ] = g;
  273.  
  274.         ng.ng_LeftEdge      =   bleft + 8;
  275.         ng.ng_TopEdge       =   btop + 16;
  276.         ng.ng_Width         =   284;
  277.         ng.ng_Height        =   60;
  278.         ng.ng_GadgetText    =   "Menus:";
  279.         ng.ng_GadgetID      =   GD_LIST;
  280.         ng.ng_Flags         =   PLACETEXT_ABOVE;
  281.  
  282.         g = CreateGadget( LISTVIEW_KIND, g, &ng, GTLV_Labels, &ExtMenus, GTLV_ShowSelected, meGadgets[ GD_ENTER ], GTLV_Selected, ~0, TAG_DONE );
  283.  
  284.         meGadgets[ GD_LIST ] = g;
  285.  
  286.         ng.ng_LeftEdge      =   bleft + 266;
  287.         ng.ng_TopEdge       =   btop + 85;
  288.         ng.ng_GadgetText    =   "_Disabled";
  289.         ng.ng_Flags         =   PLACETEXT_LEFT;
  290.         ng.ng_GadgetID      =   GD_DISABLED;
  291.  
  292.         g = CreateGadget( CHECKBOX_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  293.  
  294.         meGadgets[ GD_DISABLED ] = g;
  295.  
  296.         ng.ng_TopEdge       =   btop + 100;
  297.         ng.ng_LeftEdge      =   bleft + 231;
  298.         ng.ng_Width         =   60;
  299.         ng.ng_Height        =   13;
  300.         ng.ng_GadgetText    =   "D_ONE";
  301.         ng.ng_GadgetID      =   GD_DONE;
  302.         ng.ng_Flags         =   PLACETEXT_IN;
  303.  
  304.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  305.  
  306.         ng.ng_LeftEdge      =   bleft + 83;
  307.         ng.ng_GadgetText    =   "_ItemEd";
  308.         ng.ng_GadgetID      =   GD_ITEMED;
  309.  
  310.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  311.  
  312.         ng.ng_LeftEdge      =   bleft + 158;
  313.         ng.ng_GadgetText    =   "D_elete";
  314.         ng.ng_GadgetID      =   GD_DELETE;
  315.  
  316.         g = CreateGadget( BUTTON_KIND, g, &ng, GT_Underscore, '_', TAG_DONE );
  317.  
  318.         if ( g ) {
  319.  
  320.             menwTags[6].ti_Data = (Tag)meGList;
  321.  
  322.             if ( meWnd = OpenWindowTagList( NULL, menwTags )) {
  323.  
  324.                 meZoom[0] = l;
  325.                 meZoom[1] = t;
  326.                 meZoom[2] = w;
  327.                 meZoom[3] = h;
  328.  
  329.                 GT_RefreshWindow( meWnd, NULL );
  330.  
  331.                 do {
  332.                     WaitPort( meWnd->UserPort );
  333.  
  334.                     while ( ReadIMsg( meWnd )) {
  335.  
  336.                         switch ( Class ) {
  337.  
  338.                             case    IDCMP_REFRESHWINDOW:
  339.                                 GT_BeginRefresh( meWnd );
  340.                                 GT_EndRefresh( meWnd, TRUE );
  341.                                 break;
  342.  
  343.                             case    IDCMP_CLOSEWINDOW:
  344.                                 running = FALSE;
  345.                                 break;
  346.  
  347.                             case    IDCMP_VANILLAKEY:
  348.                                 switch( Code ) {
  349.  
  350.                                     case    'd':
  351.                                         FlipFlop( meWnd, meGadgets, GD_DISABLED, &meDisabled );
  352.                                         break;
  353.  
  354.                                     case    'i':
  355.                                         goto Items;
  356.  
  357.                                     case    'e':
  358.                                         goto Delete;
  359.  
  360.                                     case    'o':
  361.                                         goto Done;
  362.                                 }
  363.                                 break;
  364.  
  365.                             case    IDCMP_GADGETUP:
  366.                                 switch ( Object->GadgetID ) {
  367.  
  368.                                     case    GD_LIST:
  369.                                         if ( meMenu ) {
  370.                                             if ( meDisabled )
  371.                                                     meMenu->em_NewMenu.nm_Flags |= NM_MENUDISABLED;
  372.                                             else
  373.                                                     meMenu->em_NewMenu.nm_Flags &= ~NM_MENUDISABLED;
  374.                                         }
  375.                                         meMenu = ( struct ExtNewMenu * )FindNode(( struct List * )&ExtMenus, Code );
  376.                                         if (( meMenu->em_NewMenu.nm_Flags & NM_MENUDISABLED ) == NM_MENUDISABLED )
  377.                                             meDisabled = TRUE; else meDisabled = FALSE;
  378.  
  379.                                         GT_SetGadgetAttrs( meGadgets[ GD_DISABLED ], meWnd, 0l, GTCB_Checked, meDisabled, TAG_DONE );
  380.                                         break;
  381.  
  382.                                     case    GD_ENTER:
  383.                                         ptr = (( struct StringInfo * )meGadgets[ GD_ENTER ]->SpecialInfo )->Buffer;
  384.  
  385.                                         if ( strlen( ptr )) {
  386.                                             if ( NOT meMenu ) {
  387.                                                 if ( menu = GetExtMenu( ptr, NM_TITLE )) {
  388.                                                     GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  389.                                                     if ( meDisabled )
  390.                                                         menu->em_NewMenu.nm_Flags |= NM_MENUDISABLED;
  391.                                                     AddTail(( struct List * )&ExtMenus, ( struct Node * )menu );
  392.                                                     GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, &ExtMenus, TAG_DONE );
  393.                                                     meMenu = 0l;
  394.                                                 }
  395.                                             } else {
  396.                                                 GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  397.                                                 strcpy( &meMenu->em_TheMenuName[0], ptr );
  398.                                                 if ( meDisabled )
  399.                                                         meMenu->em_NewMenu.nm_Flags |= NM_MENUDISABLED;
  400.                                                 else
  401.                                                         meMenu->em_NewMenu.nm_Flags &= ~NM_MENUDISABLED;
  402.  
  403.                                                 GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, &ExtMenus, TAG_DONE );
  404.                                                 meMenu = 0l;
  405.                                             }
  406.                                         }
  407.                                         break;
  408.  
  409.                                     case    GD_DISABLED:
  410.                                         FlipFlop( 0l, 0l, 0l, &meDisabled );
  411.                                         break;
  412.  
  413.                                     case    GD_DELETE:
  414.                                         Delete:
  415.                                         if ( meMenu ) {
  416.                                             if ( MyRequest( "Excuse me..", "YES|NO", "--> %s <--\nAre you sure you want\nto delete this menu ?" , meMenu->em_NodeName )) {
  417.                                                 GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  418.                                                 Remove(( struct Node * )meMenu );
  419.                                                 FreeMenu( meMenu );
  420.                                                 GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, &ExtMenus, TAG_DONE );
  421.                                                 meMenu = 0l;
  422.                                             }
  423.                                         }
  424.                                         break;
  425.  
  426.                                     case    GD_ITEMED:
  427.                                         Items:
  428.                                         if ( meMenu ) {
  429.                                             GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, ~0, TAG_DONE );
  430.                                             ItemEdit( meMenu );
  431.                                             GT_SetGadgetAttrs( meGadgets[ GD_LIST ], meWnd, 0l, GTLV_Labels, &ExtMenus, TAG_DONE );
  432.                                         }
  433.                                         meMenu = 0l;
  434.                                         break;
  435.  
  436.                                     case    GD_DONE:
  437.                                         Done:
  438.                                         running = FALSE;
  439.                                         break;
  440.                                 }
  441.                                 break;
  442.                         }
  443.                     }
  444.                 } while ( running );
  445.             }
  446.         }
  447.     }
  448.  
  449.     if ( meMenu ) {
  450.         if ( meDisabled )
  451.             meMenu->em_NewMenu.nm_Flags |= NM_MENUDISABLED;
  452.         else
  453.             meMenu->em_NewMenu.nm_Flags &= ~NM_MENUDISABLED;
  454.     }
  455.  
  456.     Saved = FALSE;
  457.  
  458.     if ( meWnd )           CloseWindow( meWnd );
  459.     if ( meGList )         FreeGadgets( meGList );
  460.  
  461.     meWnd   = 0l;
  462.     meGList = 0l;
  463.  
  464.     ClearMsgPort( MainWindow->UserPort );
  465.  
  466.     return( TRUE );
  467. }
  468.